﻿/****************************************************************************
 * Application   : Freekick Desktop Manager
 * Author        : sfreekick
 * Email         : sfreekick@gmail.com
 * Copyright     : (C) 2008 sfreekick
 * **************************************************************************/

/****************************************************************************
 *  This file is part of FreeKickManager.
 *
 *  FreeKickManager is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  FreeKickManager is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with FreeKickManager. If not, see <http://www.gnu.org/licenses/>.
 ****************************************************************************/

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using FKVM;
using System.Globalization;

namespace FreeKickManager
{
    public class FKDMApi
    {
        private FKVMVirtualMachine vm = new FKVMVirtualMachine();
        private TextBox txtSalida = null;
        private BDFreeKick bd = null;
        private Jugador jugadorActual = null;
        private Dictionary<string, string> propiedadesJugadorActual = new Dictionary<string, string>();

        private List<Jugador> listaJugadores = null;
        private int indiceJugador = -1;

        public FKDMApi(FKVMVirtualMachine vm)
        {
            this.bd = FrmPrincipal.bd;
            this.vm = vm;

            //Registro de funciones
            registrarFunciones();
        }

        public FKDMApi(FKVMVirtualMachine vm, TextBox txtSalida)
        {
            this.bd = FrmPrincipal.bd;
            this.vm = vm;
            this.txtSalida = txtSalida;

            //Registro de funciones
            registrarFunciones();
        }

        #region Métodos Privados

        private void registrarFunciones()
        {
            vm.registrarFuncionApi("eJugador", this.eJugador);
            vm.registrarFuncionApi("rJugador", this.rJugador);
            vm.registrarFuncionApi("sJugador", this.sJugador);

            vm.registrarFuncionApi("recorrerJugadores", this.recorrerJugadores);
            vm.registrarFuncionApi("siguienteJugador", this.siguienteJugador);

            vm.registrarFuncionApi("insertarTexto", this.insertarTexto);
            vm.registrarFuncionApi("insertarEntero", this.insertarEntero);
            vm.registrarFuncionApi("insertarReal", this.insertarReal);
            vm.registrarFuncionApi("nuevaLinea", this.nuevaLinea);
        }

        private void insertarPropiedad(string nombre, string valor)
        {
            if (propiedadesJugadorActual.ContainsKey(nombre))
                propiedadesJugadorActual[nombre] = valor;
            else
                propiedadesJugadorActual.Add(nombre, valor);
        }

        private void insertarPropiedad(string nombre, int valor)
        {
            if (propiedadesJugadorActual.ContainsKey(nombre))
                propiedadesJugadorActual[nombre] = valor.ToString();
            else
                propiedadesJugadorActual.Add(nombre, valor.ToString());
        }

        private void limpiarJugadorActual()
        {
            propiedadesJugadorActual.Clear();
        }

        #endregion

        #region Métodos Públicos

        public void setJugadorActual(Jugador j)
        {
            jugadorActual = j;

            limpiarJugadorActual();

            insertarPropiedad("id", j.id);
            insertarPropiedad("nombre", j.nombre);
            insertarPropiedad("apellidos", j.apellidos);
            insertarPropiedad("años", j.años);
            insertarPropiedad("meses", j.meses);
            insertarPropiedad("dias", j.dias);
            insertarPropiedad("ACTREM", j.estado.actrem);
            insertarPropiedad("POTREM", j.estado.potrem);
            insertarPropiedad("ACTDES", j.estado.actdes);
            insertarPropiedad("POTDES", j.estado.potdes);
            insertarPropiedad("ACTCB", j.estado.actcb);
            insertarPropiedad("POTCB", j.estado.potcb);
            insertarPropiedad("ACTPA", j.estado.actpa);
            insertarPropiedad("POTPA", j.estado.potpa);
            insertarPropiedad("ACTAE", j.estado.actae);
            insertarPropiedad("POTAE", j.estado.potae);
            insertarPropiedad("ACTCON", j.estado.actcon);
            insertarPropiedad("POTCON", j.estado.potcon);
            insertarPropiedad("ACTENT", j.estado.actent);
            insertarPropiedad("POTENT", j.estado.potent);
            insertarPropiedad("ACTCOL", j.estado.actcol);
            insertarPropiedad("POTCOL", j.estado.potcol);
            insertarPropiedad("ACTREF", j.estado.actref);
            insertarPropiedad("POTREF", j.estado.potref);
            insertarPropiedad("ACTCT", j.estado.actct);
            insertarPropiedad("POTCT", j.estado.potct);
            insertarPropiedad("ACTINT", j.estado.actint);
            insertarPropiedad("POTINT", j.estado.potint);
            insertarPropiedad("ACTORG", j.estado.actorg);
            insertarPropiedad("POTORG", j.estado.potorg);
            insertarPropiedad("forma", j.estado.forma);
            insertarPropiedad("tendencia", j.estado.tendencia);
            insertarPropiedad("pierna", j.pierna == Pierna.Diestro ? 0 : 1);
            insertarPropiedad("experiencia", j.experiencia);
            insertarPropiedad("categoria", j.categoria);
            insertarPropiedad("subcategoria", j.subcategoria);
            insertarPropiedad("apodo", j.nick);
            insertarPropiedad("nacionalidad", j.nacionalidad);
            insertarPropiedad("juvenil", j.juvenil == true ? 1 : 0);
            insertarPropiedad("lealtad", j.lealtad);
            insertarPropiedad("salario", j.salario);
            insertarPropiedad("comprado", j.precioCompra);
            insertarPropiedad("llegada", j.fechaEntrada);
        }

        public void eJugador()
        {
            string prop = vm.obtenerParametroString();

            int val = 0;

            if(propiedadesJugadorActual.ContainsKey(prop))
                val = Convert.ToInt32(propiedadesJugadorActual[prop]);

            vm.devolverRetornoInt(val);
        }

        public void rJugador()
        {
            string prop = vm.obtenerParametroString();

            float val = 0F;

            if (propiedadesJugadorActual.ContainsKey(prop))
            {
                NumberFormatInfo provider = new NumberFormatInfo();
                provider.NumberDecimalSeparator = ".";
                val = Convert.ToSingle(propiedadesJugadorActual[prop]);
            }

            vm.devolverRetornoFloat(val);
        }

        public void sJugador()
        {
            string prop = vm.obtenerParametroString();

            string val = "";

            if (propiedadesJugadorActual.ContainsKey(prop))
                val = propiedadesJugadorActual[prop];

            vm.devolverRetornoString(val);
        }


        public void nuevaLinea()
        {
            txtSalida.AppendText("\r\n");
        }
        
        public void insertarTexto()
        {
            string texto = vm.obtenerParametroString();

            txtSalida.AppendText(texto);
        }

        public void insertarEntero()
        {
            int texto = vm.obtenerParametroInt();

            txtSalida.AppendText("" + texto);
        }

        public void insertarReal()
        {
            float texto = vm.obtenerParametroFloat();

            NumberFormatInfo provider = new NumberFormatInfo();
            provider.NumberDecimalSeparator = ".";
            txtSalida.AppendText("" + texto.ToString(provider));
        }

        public void recorrerJugadores()
        {
            listaJugadores = bd.selectAllJugadorCompleto();

            indiceJugador = -1;
        }

        public void siguienteJugador()
        {
            if (listaJugadores != null && indiceJugador < (listaJugadores.Count - 1))
            {
                indiceJugador++;

                setJugadorActual(listaJugadores[indiceJugador]);
            }
            else
            {
                indiceJugador = -1;
            }

            vm.devolverRetornoInt(indiceJugador);
        }
            
        #endregion
    }
}
